package com.briup.test02;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.sql.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;

/**
 * @author yuxi
 * @version 1.0
 * @date 2025/11/7
 * @Description:
 */
//（不使用工具类JdbcUtils ）使用原生的
// PreparedStatement+事务手动提交，完成上述功能。
//清空t_customer表中数据，在上述代码基础上，
// 添加批处理（每次处理3条数据），完成数据插入功能。
public class Test02 {
    /**
     * 数据库处理：
     *      数据库四要素
     *      1.注册驱动
     *      2.获取conn
     *      3.获取stms，执行executeUpdate(truncate)
     *      3.开启事务
     *      4.获取pstms(sql) insert
     *      按行读取文件里后，8次处理【
     *      每一条信息:验证数据的合法性
     *      5.设置值
     *      6.添加到批处理中
     *      7.每3条执行一次批处理
     *      】
     *      8.执行一次批处理
     *      8.事务提交
     *      9.已经有链接后，只要有异常的时候做事务回滚
     *      10.关闭资源
     * 文件IO处理
     * 业务：File 方向：【输入Reader】 InputStream
     * 数据类型：字符
     * ==》FileReader
     * ==>按行读取readLine==>BufferedReader包装
     * 1.创建流  包装流（节点流）
     * 2.读取
     *      while(能读到!=null){
     *          String line;
     *          业务处理：将字符串以:分隔形成数组
     *          字符串数组-->里面的值做数据类型转换
     *          -->将该条数据插入数据库中(设置值、执行)
     *      }
     * 3.关闭流
     *
     * 组合：
     * 前置各种对象创建
     * 对文件进行循环while{
     *     业务处理
     * }
     * 数据库的收尾操作
     * 关闭资源
     */

    public static String driverClass="com.mysql.cj.jdbc.Driver";
    public static String url="jdbc:mysql://127.0.0.1:3306/briup";
    public static String username="briup";
    public static String password="briup";

    public static Connection conn=null;
    public static PreparedStatement pstms=null;
    public static BufferedReader br=null;

    public static void main(String[] args) {
        /*
        1.注册驱动
     *      2.获取conn
     3.获取stms，执行executeUpdate(truncate)
     *
     *      3.开启事务
     *      4.获取pstms(sql) insert
     *  1.创建流  包装流（节点流）
         */
        try {
            Class.forName(driverClass);
            conn= DriverManager.getConnection(url,username,password);

            Statement stms = conn.createStatement();
            stms.executeUpdate("truncate t_customer");
            System.out.println("已清空表");
            stms.close();

            conn.setAutoCommit(false);
            pstms=conn.prepareStatement(
                    "insert into t_customer" +
                            "(id,name,age,birthday,register_time)" +
                            " values(?,?,?,?,now())");
            br=new BufferedReader(new FileReader(
                    "3-jdbc-demo/src/customer.txt"));
            /** 2.读取
             *      while(能读到!=null){
             *          String line;
             *          业务处理：将字符串以:分隔形成数组
             *          字符串数组-->里面的值做数据类型转换
             *          -->将该条数据插入数据库中(设置值、执行)
             *      }*/
            String line=null;
            int count=0;
            while((line=br.readLine())!=null){
                /*
                //只要有一条数据错误，都不进行操作
                if(line.isEmpty()||!line.contains(":")){
                    System.out.println("本次执行全部不做");
                    conn.rollback();
                    break;
                }
                 */
                if(line.isEmpty()) {
                    System.out.println("当前数据为空，不进行处理"+line);
                    continue;
                }
                String[] arr = line.split(":");
                if(arr.length!=4){
                    System.out.println("当前数据格式不正确，不进行处理"+line);
                    continue;
                }

                int id=Integer.parseInt(arr[0]);
                String name=arr[1];
                int age=Integer.parseInt(arr[2]);
                //java.sql.Date birthday=java.sql.Date.valueOf(arr[3]);
                SimpleDateFormat simple = new SimpleDateFormat("yyyy-MM-dd");
                java.util.Date udate=simple.parse(arr[3]);
                long timestamp=udate.getTime();
                Date birthday=new Date(timestamp);
                /*
                每一条信息
             *      5.设置值
                    6.添加到批处理中
         *          7.每3条执行一次批处理
                 */
                pstms.setInt(1,id);
                pstms.setString(2,name);
                pstms.setInt(3,age);
                pstms.setDate(4,birthday);
                //int num=pstms.executeUpdate();
                //System.out.println("已成功插入："+num+"条数据");
                pstms.addBatch();
                count++;

                if(count%3==0){
                    pstms.executeBatch();
                    System.out.println("执行了一次批处理");
                }
            }
            //8.执行一次批处理
            pstms.executeBatch();
            System.out.println("执行了一次批处理");
            //8.事务提交
            conn.commit();
            System.out.println("事务已提交");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            try {
                if(conn!=null) {
                    conn.rollback();
                    System.out.println("事务已回滚");
                }
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ParseException e) {
            e.printStackTrace();
        } catch (Exception e){
            try {
                if(conn!=null) {
                    conn.rollback();
                    System.out.println("事务已回滚");
                }
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
            e.printStackTrace();
        }finally {
            try {
                if (br != null) br.close();
                if(pstms!=null) pstms.close();
                if(conn!=null) conn.close();
                System.out.println("程序结束");
            } catch (IOException e) {
                e.printStackTrace();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

}